#include "usermanagementwidget.h"
#include "ui_usermanagementwidget.h"
#include "userdialog.h"
#include <QHeaderView>
#include <QDateTime>

// 构造函数
UserManagementWidget::UserManagementWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::UserManagementWidget)
    , userTableModel(nullptr)
    , userDialog(nullptr)
    , searchTimer(nullptr)
{
    // 初始化当前用户为无效用户
    m_currentUser.id = -1;
    ui->setupUi(this);
    setupUI();
    
    // 初始化搜索延时器
    searchTimer = new QTimer(this);
    searchTimer->setSingleShot(true);
    searchTimer->setInterval(300); // 300ms延时搜索
    connect(searchTimer, &QTimer::timeout, this, &UserManagementWidget::onSearchTextChanged);
    
    // 加载初始数据
    refreshUserList();
}

// 析构函数
UserManagementWidget::~UserManagementWidget()
{
    delete ui;
    if (userDialog) {
        delete userDialog;
    }
}

// 初始化界面
void UserManagementWidget::setupUI()
{
    // 初始化表格模型
    userTableModel = new QStandardItemModel(this);
    userTableModel->setHorizontalHeaderLabels({
        "ID", "用户名", "角色", "创建时间"
    });
    
    ui->userTableView->setModel(userTableModel);
    
    // 设置表格列宽自适应
    QHeaderView* header = ui->userTableView->horizontalHeader();
    header->setStretchLastSection(true);  // 最后一列自动拉伸填充
    header->setSectionResizeMode(0, QHeaderView::Fixed);        // ID列固定宽度
    header->setSectionResizeMode(1, QHeaderView::Stretch);      // 用户名列自适应
    header->setSectionResizeMode(2, QHeaderView::Fixed);        // 角色列固定宽度
    header->setSectionResizeMode(3, QHeaderView::Stretch);      // 时间列自适应
    
    // 设置固定列的具体宽度
    ui->userTableView->setColumnWidth(0, 80);   // ID列
    ui->userTableView->setColumnWidth(2, 120);  // 角色列
    
    // 连接信号槽
    connect(ui->addUserBtn, &QPushButton::clicked, this, &UserManagementWidget::onAddUserClicked);
    connect(ui->editUserBtn, &QPushButton::clicked, this, &UserManagementWidget::onEditUserClicked);
    connect(ui->deleteUserBtn, &QPushButton::clicked, this, &UserManagementWidget::onDeleteUserClicked);
    connect(ui->refreshBtn, &QPushButton::clicked, this, &UserManagementWidget::onRefreshClicked);
    
    // 搜索框文本变化时启动延时器
    connect(ui->searchLineEdit, &QLineEdit::textChanged, this, [this]() {
        searchTimer->start();
    });
    
    // 表格选择变化
    connect(ui->userTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
            this, &UserManagementWidget::onSelectionChanged);
    
    // 初始状态：编辑和删除按钮禁用
    ui->editUserBtn->setEnabled(false);
    ui->deleteUserBtn->setEnabled(false);
}

// 刷新用户列表
void UserManagementWidget::refreshUserList()
{
    allUsers = DatabaseManager::getInstance().getAllUsers();
    loadUserData();
}

// 加载用户数据到表格
void UserManagementWidget::loadUserData()
{
    userTableModel->clear();
    userTableModel->setHorizontalHeaderLabels({
        "ID", "用户名", "角色", "创建时间"
    });
    
    for (const auto& user : allUsers) {
        QList<QStandardItem*> rowItems;
        
        // ID列
        auto idItem = new QStandardItem(QString::number(user.id));
        idItem->setData(user.id, Qt::UserRole); // 存储用户ID
        rowItems.append(idItem);
        
        // 用户名列
        rowItems.append(new QStandardItem(user.username));
        
        // 角色列
        QString roleText = (user.role == "admin") ? "管理员" : "普通用户";
        rowItems.append(new QStandardItem(roleText));
        
        // 创建时间列（显示真实时间）
        QString formattedTime = formatDateTime(user.createdAt);
        rowItems.append(new QStandardItem(formattedTime));
        
        // 设置行数据为只读
        for (auto item : rowItems) {
            item->setEditable(false);
        }
        
        userTableModel->appendRow(rowItems);
    }
    
    updateStatusLabel();
}

// 过滤用户数据
void UserManagementWidget::filterUserData(const QString& searchText)
{
    if (searchText.isEmpty()) {
        loadUserData();
        return;
    }
    
    userTableModel->clear();
    userTableModel->setHorizontalHeaderLabels({
        "ID", "用户名", "角色", "创建时间"
    });
    
    for (const auto& user : allUsers) {
        if (user.username.contains(searchText, Qt::CaseInsensitive)) {
            QList<QStandardItem*> rowItems;
            
            auto idItem = new QStandardItem(QString::number(user.id));
            idItem->setData(user.id, Qt::UserRole);
            rowItems.append(idItem);
            
            rowItems.append(new QStandardItem(user.username));
            
            QString roleText = (user.role == "admin") ? "管理员" : "普通用户";
            rowItems.append(new QStandardItem(roleText));
            
            QString formattedTime = formatDateTime(user.createdAt);
            rowItems.append(new QStandardItem(formattedTime));
            
            for (auto item : rowItems) {
                item->setEditable(false);
            }
            
            userTableModel->appendRow(rowItems);
        }
    }
    
    updateStatusLabel();
}

// 添加用户按钮点击
void UserManagementWidget::onAddUserClicked()
{
    if (!userDialog) {
        userDialog = new UserDialog(this);
    }
    
    userDialog->setWindowTitle("添加用户");
    userDialog->clearForm();
    
    if (userDialog->exec() == QDialog::Accepted) {
        refreshUserList();
        showSuccess("用户添加成功！");
    }
}

// 编辑用户按钮点击
void UserManagementWidget::onEditUserClicked()
{
    UserInfo selectedUser = getSelectedUser();
    if (selectedUser.id == -1) {
        showError("请先选择要编辑的用户！");
        return;
    }
    
    // 检查是否尝试编辑当前登录的管理员
    if (m_currentUser.role == "admin" && selectedUser.id == m_currentUser.id) {
        showError("管理员不能编辑自己的信息！\n请联系其他管理员或使用个人资料页面修改基本信息。");
        return;
    }
    
    if (!userDialog) {
        userDialog = new UserDialog(this);
    }
    
    userDialog->setWindowTitle("编辑用户");
    userDialog->setUserInfo(selectedUser);
    
    if (userDialog->exec() == QDialog::Accepted) {
        refreshUserList();
        showSuccess("用户信息更新成功！");
    }
}

// 删除用户按钮点击
void UserManagementWidget::onDeleteUserClicked()
{
    UserInfo selectedUser = getSelectedUser();
    if (selectedUser.id == -1) {
        showError("请先选择要删除的用户！");
        return;
    }
    
    // 防止删除默认管理员
    if (selectedUser.username == "admin") {
        showError("不能删除默认管理员账户！");
        return;
    }
    
    QString message = QString("确定要删除用户 \"%1\" 吗？\n此操作不可撤销！")
                     .arg(selectedUser.username);
    
    if (showConfirmation(message)) {
        if (DatabaseManager::getInstance().deleteUser(selectedUser.id)) {
            refreshUserList();
            showSuccess("用户删除成功！");
        } else {
            showError("删除用户失败！");
        }
    }
}

// 刷新按钮点击
void UserManagementWidget::onRefreshClicked()
{
    refreshUserList();
    ui->searchLineEdit->clear();
    showSuccess("用户列表已刷新！");
}

// 搜索文本变化
void UserManagementWidget::onSearchTextChanged()
{
    QString searchText = ui->searchLineEdit->text().trimmed();
    filterUserData(searchText);
}

// 表格选择变化
void UserManagementWidget::onSelectionChanged()
{
    bool hasSelection = ui->userTableView->selectionModel()->hasSelection();
    ui->editUserBtn->setEnabled(hasSelection);
    ui->deleteUserBtn->setEnabled(hasSelection);
}

// 获取选中用户信息
UserInfo UserManagementWidget::getSelectedUser()
{
    UserInfo userInfo;
    userInfo.id = -1; // 默认无效ID
    
    QModelIndexList selectedRows = ui->userTableView->selectionModel()->selectedRows();
    if (selectedRows.isEmpty()) {
        return userInfo;
    }
    
    int row = selectedRows.first().row();
    QStandardItem* idItem = userTableModel->item(row, 0);
    if (idItem) {
        int userId = idItem->data(Qt::UserRole).toInt();
        
        // 从缓存中查找完整用户信息
        for (const auto& user : allUsers) {
            if (user.id == userId) {
                userInfo = user;
                break;
            }
        }
    }
    
    return userInfo;
}

// 更新状态标签
void UserManagementWidget::updateStatusLabel()
{
    int totalUsers = userTableModel->rowCount();
    ui->statusLabel->setText(QString("📊 总用户数: %1").arg(totalUsers));
}

// 显示错误信息
void UserManagementWidget::showError(const QString& message)
{
    QMessageBox::warning(this, "错误", message);
}

// 显示成功信息
void UserManagementWidget::showSuccess(const QString& message)
{
    QMessageBox::information(this, "成功", message);
}

// 显示确认对话框
bool UserManagementWidget::showConfirmation(const QString& message)
{
    int ret = QMessageBox::question(this, "确认操作", message,
                                   QMessageBox::Yes | QMessageBox::No);
    return (ret == QMessageBox::Yes);
}

// 格式化日期时间显示
QString UserManagementWidget::formatDateTime(const QString& dateTime)
{
    if (dateTime.isEmpty()) {
        return "未知";
    }
    
    // 尝试解析ISO格式的日期时间
    QDateTime dt = QDateTime::fromString(dateTime, Qt::ISODate);
    if (!dt.isValid()) {
        // 如果ISO格式解析失败，尝试SQLite默认格式
        dt = QDateTime::fromString(dateTime, "yyyy-MM-dd hh:mm:ss");
    }
    
    if (dt.isValid()) {
        return dt.toString("yyyy-MM-dd hh:mm:ss");
    }
    
    // 如果解析失败，返回原始字符串
    return dateTime;
}

// 设置当前登录用户信息
void UserManagementWidget::setCurrentUser(const UserInfo& currentUser)
{
    m_currentUser = currentUser;
}